package com.bestcem.xm.award.dao;

import com.bestcem.xm.award.entity.pojo.AwardRecordDO;
import com.bestcem.xm.award.enums.AwardIssueStatusEnum;
import com.bestcem.xm.award.enums.RecordStatusEnum;
import com.bestcem.xm.award.grpc.service.param.draw.*;
import com.bestcem.xm.award.service.dto.draw.AwardDetailDTO;
import com.bestcem.xm.award.service.dto.draw.PageDTO;

import java.util.List;

/**
 * 抽奖记录AWARD_RECORD表操作Dao
 *
 * @author hang.li <hang.li@idiaoyan.com>
 * @version v1.0
 * @date 2021/6/29 13:35
 */
public interface DrawRecordDao {

    /**
     * 根据页面标识获取抽奖记录
     *
     * @param awardPage 页面标识
     * @return 抽奖记录
     */
    AwardRecordDO getRecordByAwardPage(String awardPage);

    /**
     * 获取奖励已经被抽奖的次数
     *
     * @param awardId 奖励id
     * @return 总数
     */
    long getAwardAlreadyDrawTotal(String awardId);

    /**
     * 根据抽奖手机号获取用户的抽奖次数
     *
     * @param awardId 奖励id
     * @param phone 抽奖手机号
     * @return 总记录数
     */
    long getDrawTotalByPhone(String awardId, String phone);

    /**
     * 抽奖手机号获取用户的中奖次数
     *
     * @param awardId 奖励id
     * @param phone 抽奖手机号
     * @return 总记录数
     */
    long getWinTotalByPhone(String awardId, String phone);

    /**
     * 新增抽奖记录
     *
     * @param awardRecord AWARD_RECORD表实体类
     * @return 插入的记录
     */
    AwardRecordDO insertDrawRecord(AwardRecordDO awardRecord);

    /**
     * 根据id和抽奖状态获取抽奖记录
     *
     * @param recordId 抽奖记录id
     * @param status 抽奖状态 {@link RecordStatusEnum}
     * @return 抽奖记录
     */
    AwardRecordDO getRecordByIdAndStatus(String recordId, Integer status);

    /**
     * 根据中奖记录id批量修改中奖状态
     *
     * @param recordIds 中奖记录id列表
     * @param status 要修改的状态 {@link AwardIssueStatusEnum}
     * @return 修改的条数
     */
    long updateWinStatusById(List<String> recordIds, Integer status);

    /**
     * 保存中奖联系方式
     *
     * @param param 保存中奖联系方式请求参数
     * @param isArr 是否为地址寄送方式
     * @return 修改的条数
     */
    long updateWinnerMessage(SaveWinnerMessageParam param, boolean isArr);

    /**
     * 通过奖励id、抽奖记录id、投放id、抽奖状态获取抽奖记录
     *
     * @param awardId 奖励id
     * @param deliverId 投放id
     * @param recordId 抽奖记录id
     * @param status 抽奖状态
     * @return 抽奖记录
     */
    AwardRecordDO getRecordByIdsAndStatus(String awardId, String recordId, String deliverId, Integer status);

    /**
     * 分页查询抽奖记录
     *
     * @param param 获取中奖名单请求参数
     * @param pageParam 分页参数
     * @return 抽奖记录List
     */
    PageDTO<AwardRecordDO> getRecordListByPage(GetWinnersParam param, PageParam pageParam);

    /**
     * 分页查询中奖记录奖项详情
     *
     * @param param 获取中奖名单中的奖项信息请求参数
     * @param pageParam 分页参数
     * @param levelList 奖项等级列表
     * @return 中奖记录List
     */
    PageDTO<AwardRecordDO> getRecordDetailByPage(ListWinnerDetailsParam param, PageParam pageParam, List<Integer> levelList);

    /**
     * 获取要导出的中奖名单信息
     *
     * @param param 导出中奖名单请求参数
     * @return 中奖记录List
     */
    List<AwardRecordDO> getExportRecords(ExportWinnersParam param);

    /**
     * 获取导出中奖名单中的奖项信息
     *
     * @param param 导出中奖名单中的奖项信息请求参数
     * @param levelList 奖项等级列表
     * @return 中奖记录List
     */
    List<AwardRecordDO> getExportRecordDetails(ExportWinnerDetailsParam param, List<Integer> levelList);

    /**
     * 获取各状态下的抽奖次数
     *
     * @param awardId 奖励id
     * @param deliverId 投放id
     * @param status 抽奖状态
     * @return 抽奖次数count
     */
    long getDrawCountByIdAndStatus(String awardId, String deliverId, Integer status);

    /**
     * 聚合统计各奖项的抽奖情况
     *
     * @param awardId 奖励id
     * @param deliverId 投放id
     * @param status 抽奖状态
     * @return 聚合结果
     */
    List<AwardDetailDTO> getAwardDetailByAgg(String awardId, String deliverId, Integer status);

    /**
     * 根据页面标识和抽奖状态获取抽奖记录
     *
     * @param awardPage 页面标识
     * @param status 抽奖状态
     * @return 抽奖记录
     */
    AwardRecordDO getRecordByAwardPageAndStatus(String awardPage, Integer status);

    /**
     * 根据页面标识修改抽奖状态
     *
     * @param awardPage 页面标识
     * @param status 抽奖状态
     * @return 修改条数
     */
    long updateRecordStatusByAwardPage(String awardPage, Integer status);

    /**
     * 添加中奖信息
     *
     * @param awardPage 页面标识
     * @param win 中奖信息
     * @return 添加条数
     */
    long updateRecordWinByAwardPage(String awardPage, AwardRecordDO.Win win);

    /**
     * 修改抽奖状态
     *
     * @param awardPage 页面标识
     * @param status 抽奖状态
     * @return 修改条数
     */
    long updateStatusByAwardPageAndStatus(String awardPage, Integer status);

    /**
     * 根据页面标识和抽奖手机号获取抽奖记录
     *
     * @param awardPage 页面标识
     * @param phone 抽奖手机号
     * @return 抽奖记录
     */
    AwardRecordDO getRecordByPageAndPhone(String awardPage, String phone);

    /**
     * 根据id获取未中奖的抽奖记录数
     *
     * @param awardId 奖励id
     * @param deliverId 投放id
     * @return 未中奖的抽奖记录总数
     */
    long getNoWinCountById(String awardId, String deliverId);
}
